package response

import "interview/pkg/common"

// Response 封装HTTP响应
type Response struct {
	// Code 响应代码
	Code int `json:"code"`
	// Data 数据内容
	Data interface{} `json:"data"`
	// Msg 提示信息
	Msg string `json:"msg"`
}

// PageInfo 带分页信息的响应信息封装
type PageInfo struct {
	// PageSize 页面大小
	PageSize uint `json:"pageSize"`
	// Total 数据总数
	Total uint `json:"total"`
	// PageNum 当前页数
	PageNum uint `json:"pageNum"`
}

// PageData 分页数据封装
type PageData struct {
	PageInfo
	// List 分页数据
	List interface{} `json:"list"`
}

/*
封装常见的HTTP响应方法
*/

func Result(code int, msg string, data interface{}) {
	// 结果以panic异常的形式抛出, 交由异常处理中间件处理
	panic(Response{
		Code: code,
		Data: data,
		Msg:  msg,
	})
}

func Success() {
	Result(common.SUCCESS, common.CustomError[common.SUCCESS], map[string]interface{}{})
}

func SuccessWithCode(code int, msg string) {
	Result(code, msg, struct{}{})
}

func SuccessWithCodeData(code int, data interface{}) {
	Result(code, common.CustomError[code], data)
}

func SuccessWithData(data interface{}) {
	Result(common.SUCCESS, common.CustomError[common.SUCCESS], data)
}

func SuccessWithMsg(msg string) {
	Result(common.SUCCESS, msg, map[string]interface{}{})
}

func Fail() {
	Result(common.FAIL, common.CustomError[common.FAIL], map[string]interface{}{})
}

func FailWithMsg(msg string) {
	Result(common.FAIL, msg, map[string]interface{}{})
}

func FailWithCode(code int) {
	msg := common.CustomError[common.FAIL]
	if v, ok := common.CustomError[code]; ok {
		msg = v
	}
	Result(code, msg, map[string]interface{}{})
}

func Error() {
	Result(common.InternalServerError, common.CustomError[common.InternalServerError], map[string]interface{}{})
}

func ErrorWithMsg(msg string) {
	Result(common.InternalServerError, msg, map[string]interface{}{})
}
